// 1.4 指针-扩展

/**
 * 
 * 学习 C++ 的指针既简单又有趣。通过指针，可以简化一些 C++ 编程任务的执行，还有一些任务，如动态内存分配，没有指针是无法执行的。所以，想要成为一名优秀的 C++ 程序员，学习指针是很有必要的。
 * 正如您所知道的，每一个变量都有一个内存位置，每一个内存位置都定义了可使用连字号（&）运算符访问的地址，它表示了在内存中的一个地址。请看下面的实例，它将输出定义的变量地址：
 * 
 * ------------------
 * 扩展
 * 指针数组与数组指针
 * 函数指针
*/

#include <iostream>
int add(int, int);

int main(void)
{
  int arr[] = {1, 2, 3};
  int(*ptr1)[3]; // 数组指针定义

  int *ptr;// 普通整型指针
  ptr = arr;

  ptr1 = &arr;

  for (int i = 0; i < 3; i++)
  {
    std::cout << "ptr[" << i << "] = " << ptr[i] << std::endl;
    // std::cout << "ptr1[" << i << "] = " << ptr1[i] << std::endl;// 也不知道这玩意输出的是个啥
    std::cout << "(*ptr1)[" << i << "] = " << (*ptr1)[i] << std::endl;
    std::cout << "&(*ptr1)[" << i << "] = " << &(*ptr1)[i] << std::endl;
    std::cout << "&arr[" << i << "] = " << &arr[i] << std::endl;
  }

  int (*add_c)(int, int);

  add_c = &add;
  int val = (*add_c)(1, 2);
  std::cout << "val : " << val << std::endl;

  printf("-------------end--------------\n");
  return 0;
}

int add(int a, int b)
{
  return a + b;
}